package com.casa_apoio.suport;

import com.casa_apoio.conversores.NumeroDiariasRelatorio;
import com.casa_apoio.model.dao.CidadeDAO;
import com.casa_apoio.model.dao.HospedagemDAO;
import com.casa_apoio.model.entity.Cidade;
import com.casa_apoio.model.entity.Hospedagem;
import com.casa_apoio.util.DateUtils;
import com.casa_apoio.util.FacesContextUtil;
import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Element;
import com.itextpdf.text.Font;
import com.itextpdf.text.PageSize;
import com.itextpdf.text.Paragraph;
import com.itextpdf.text.Phrase;
import com.itextpdf.text.pdf.PdfPTable;
import com.itextpdf.text.pdf.PdfWriter;
import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.Serializable;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import org.primefaces.model.DefaultStreamedContent;
import org.primefaces.model.StreamedContent;

@ManagedBean
@RequestScoped
public class BbRelatorioMensal implements Serializable {

    private StreamedContent arquivoRetorno;
    private int ano;
    private int mes;

    private Cidade cidade;
    private Hospedagem hospedagem;
    private List<Cidade> cidades;
    private List<Hospedagem> hospedagens;

    private HospedagemDAO hospedagemDAO() {
        HospedagemDAO<Hospedagem> hospedagemDAO = new HospedagemDAO<Hospedagem>(Hospedagem.class, FacesContextUtil.getRequestSession());
        return hospedagemDAO;
    }

    private CidadeDAO cidadeDAO() {
        CidadeDAO<Cidade> cidadeDAO = new CidadeDAO<Cidade>(Cidade.class, FacesContextUtil.getRequestSession());
        return cidadeDAO;
    }

    public StreamedContent getArquivoRetorno() throws FileNotFoundException, IOException, DocumentException {
        Document document = new Document(PageSize.A4.rotate());
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        PdfWriter.getInstance(document, baos);
        document.open();

        Font f = new Font(Font.FontFamily.TIMES_ROMAN, 12, Font.BOLD);
        Paragraph t1 = new Paragraph("CASA DE APOIO SANTA MARIA", f);
        t1.setAlignment(Element.ALIGN_CENTER);
        document.add(t1);

        Paragraph t2 = new Paragraph("SORRISO - MT", f);
        t2.setAlignment(Element.ALIGN_CENTER);
        document.add(t2);

        Paragraph p = new Paragraph("Lista de Hospedagem                   Mes " + mes + "/" + ano, f);
        p.setAlignment(Element.ALIGN_CENTER);
        document.add(p);
        //heaCell.setColspan(4);
        SimpleDateFormat sfd = new SimpleDateFormat("dd/MM/yyyy");
        cidades = cidadeDAO().listarCidadeOrdenada();

        Font fc = new Font(Font.FontFamily.TIMES_ROMAN, 8);
        Font fh = new Font(Font.FontFamily.TIMES_ROMAN, 8, Font.BOLD);
        for (Cidade c : cidades) {

            hospedagens = hospedagemDAO().hospedagemPorPeriodoMunicipio(c.getIdCidade(), getDataInicial(), getDataFinal());

            if (hospedagens.size() > 0) {
                Paragraph p2 = new Paragraph(c.getCidade(), new Font(Font.FontFamily.TIMES_ROMAN, 10, Font.BOLD));
                p2.setAlignment(Element.ALIGN_LEFT);
                document.add(p2);
                PdfPTable table = new PdfPTable(new float[]{0.21f, 0.07f, 0.2f, 0.12f, 0.09f, 0.12f, 0.08f, 0.07f, 0.04f});

                table.setSpacingBefore(5.0f);
                table.setWidthPercentage(100.0f);

                table.setHorizontalAlignment(Element.ALIGN_LEFT);
                table.addCell(new Phrase("Nome", fh));
                table.addCell(new Phrase("Sexo", fh));
                table.addCell(new Phrase("Endereco", fh));
                table.addCell(new Phrase("Bairro", fh));
                table.addCell(new Phrase("Situação", fh));
                table.addCell(new Phrase("Demanda", fh));
                table.addCell(new Phrase("DT. Entrada", fh));
                table.addCell(new Phrase("DT. Saida", fh));
                table.addCell(new Phrase("Dias", fh));

                int numDiarias = 0;
                for (Hospedagem h : hospedagens) {
                    table.addCell(new Phrase(h.getHospede().getNome(), fc));
                    table.addCell(new Phrase(h.getHospede().getSexo(), fc));
                    table.addCell(new Phrase(h.getHospede().getEndereco(), fc));
                    table.addCell(new Phrase(h.getHospede().getBairro(), fc));
                    table.addCell(new Phrase(h.getSituacao(), fc));
                    table.addCell(new Phrase(h.getDemanda(), fc));
                    table.addCell(new Phrase(String.valueOf(sfd.format(h.getDataEntrada())), fc));
                    table.addCell(new Phrase(String.valueOf(sfd.format(h.getDataSaida())), fc));

                    NumeroDiariasRelatorio n = new NumeroDiariasRelatorio();
                    String diarias = n.getDiarias(h.getDataEntrada(), h.getDataSaida());
                    table.addCell(new Phrase(diarias, fc));
                    numDiarias += Integer.parseInt(diarias);
                }
                document.add(table);
                Paragraph p3 = new Paragraph("Nº de Hospedes " + hospedagens.size(), new Font(Font.FontFamily.TIMES_ROMAN, 10, Font.BOLD));
                p3.setAlignment(Element.ALIGN_RIGHT);
                Paragraph p4 = new Paragraph("Nº de Diárias " + numDiarias, new Font(Font.FontFamily.TIMES_ROMAN, 10, Font.BOLD));
                p4.setAlignment(Element.ALIGN_RIGHT);

                document.add(p3);
                document.add(p4);

            }

        }

        //document.add(table);
        document.close();
        FileOutputStream fos = new FileOutputStream("C:\\PDF\\arqPDFexemplo2.pdf");
        InputStream arquivo = new FileInputStream("C:\\PDF\\arqPDFexemplo2.pdf");
        fos.write(baos.toByteArray());
        fos.close();

        arquivoRetorno = new DefaultStreamedContent(arquivo, "application/pdf", "reltorio.pdf");

        return arquivoRetorno;
    }

    public Date getDataInicial() {
        Calendar inicio = Calendar.getInstance();
        inicio.set(ano, mes - 1, 1);
        return inicio.getTime();
    }

    public Date getDataFinal() {
        Calendar fim = Calendar.getInstance();
        fim.set(ano, mes - 1, DateUtils.getMaxday(mes, ano));
        return fim.getTime();
    }

    private int formataAno(Date date) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy");
        return Integer.parseInt(sdf.format(date));
    }

    private int formataMes(Date date) {
        SimpleDateFormat sdf = new SimpleDateFormat("MM");
        return Integer.parseInt(sdf.format(date));
    }

    public int getAno() {
        if (ano < 1) {
            ano = formataAno(new Date());
        }
        return ano;
    }

    public void setAno(int ano) {
        this.ano = ano;
    }

    public int getMes() {
        if (mes < 1) {
            mes = formataMes(new Date());
        }
        return mes;
    }

    public void setMes(int mes) {
        this.mes = mes;
    }

    public List<Cidade> getCidades() {
        return cidades;
    }

    public void setCidades(List<Cidade> cidades) {
        this.cidades = cidades;
    }

    public List<Hospedagem> getHospedagens() {
        return hospedagens;
    }

    public void setHospedagens(List<Hospedagem> hospedagens) {
        this.hospedagens = hospedagens;
    }

    public Cidade getCidade() {
        return cidade;
    }

    public void setCidade(Cidade cidade) {
        this.cidade = cidade;
    }

    public Hospedagem getHospedagem() {
        return hospedagem;
    }

    public void setHospedagem(Hospedagem hospedagem) {
        this.hospedagem = hospedagem;
    }
}
